Return to Homepage

Introduction

In the following report, I will investigate and examine which animal is the king of attacks whether on land or in the water, by comparing the attacks from sharks, wolves, and alligators. While this data has already been somewhat cleaned and contains fairly simple information, this final project aims to investigate the disparities between these three animals, the attack locations, and the effected population. In simpler terms, who is responsible for the most attacks? Which populations are the most effected? Where these attacks provoked or not? These are just some of the questions I hope to explore in this writing.

Background

This project was inspired in part by my family, my mother is from Florida and there have been some very interesting documentaries done on all these animals. It was also inspired by general happen stance: I found a very nice data set on Kaggle and felt it could be an interesting take on a seemingly dull data set. As mentioned, this data set was found:

Fatal Alligator Attacks

Shark Attacks

Shark Attacks By Hemispheres

Global Wolf Attacks

The data set consists of various reported statistics regarding these different attacks. Most individuals were attacked were predatory. However, some individuals were reported to provoke the animal. Different age groups were attacked each time.

Prevention would be great, but there is not signs for those that will and could be attacked. Alligators, sharks, and wolves have different reasons to attack.

Data

# load all necessary libraries 
library(tidyverse)
library(janitor)
library(leaflet)
library(dplyr)
library(ggplot2)
library(lubridate)
library(stringr)

# reading in kaggle data sets 
gator <- read.csv("predators/fatal_alligator_attacks_US.csv")

g_wolves <- read.csv("predators/global_wolves.csv")

shark_1 <- read.csv("predators/Shark_attacks/attacks.csv")

shark_2 <- read.csv("predators/shark_attacks.csv")

shark_3 <- read.csv("predators/Shark_attacks/list_coor_australia.csv")

This data set was retrieved from Kaggle and has already been somewhat cleaned for analysis. However, there are some changes I wanted to make to the data structure, changing missing values/empty spaces, cleaning the names, and improving characters found throughout the data set. The following code and outputs demonstrate the changes I’ve made to allow for smoother data analysis:

# convert column titles to snake_case 

gator <-clean_names(gator)

g_wolves <-clean_names(g_wolves)

shark_1 <- clean_names(shark_1)

shark_2 <-clean_names(shark_2)
# converts all N/A chr values to actual missing values and fills in empty spaces with missing values 

g_wolves$type_of_attack[is.na(g_wolves$type_of_attack) | g_wolves$type_of_attack == ""] <- "Unknown"

shark_2$type[is.na(shark_2$type) | shark_2$type == "Invalid"] <- "Unknown"

shark_1 <- shark_1[!is.na(shark_1$type), ] 
shark_1_subset <- shark_1[1:6302, ]
nrow(shark_1)
## [1] 25723
length(shark_1$type)
## [1] 25723
# Check which rows have NA or invalid values
table(is.na(shark_1$type))  
## 
## FALSE 
## 25723
table(shark_1$type == "Invalid")  
## 
## FALSE  TRUE 
## 25176   547
# Replace only NAs first, then Invalids
shark_1$type[is.na(shark_1$type)] <- "Unknown"
shark_1$type[shark_1$type == "Invalid"] <- "Unknown"


# converts data structure to more appropriate data types
gator <-gator %>% 
  mutate(location = str_extract(details, "(Miami|Florida|Georgia|Texas|Louisiana|South Carolina)"),
         location = ifelse(location == "Miami", "Florida", location))

Alligator

Alligators are beautiful and dangerous animals. This data only shows a small amount of deaths that have been caused by alligators. There was no information about croc, even though they do have a hand in many deaths over the years, since they invaded the South. This data shows that Florida has had the most number of attacks. I have learned over the years is keep an eye out whenever by water on the Southern coast, you never know what might snap you up.

## # A tibble: 7 × 3
## # Groups:   location [5]
##   location       sex        n
##   <chr>          <chr>  <int>
## 1 Florida        female    11
## 2 Florida        male      19
## 3 Georgia        female     1
## 4 Louisiana      male       2
## 5 South Carolina female     4
## 6 South Carolina male       1
## 7 Texas          male       3

Unexpected Shark Attacks

When I first started trying to create this plot, this was the result. Attacks happening above Greenland. I learned how wrong I was.

knitr::include_graphics("media/Unexpected_Attacks.png")

Sharks

If any of you have a unrealistic fear that there is something in the water and you will get attacked. You’re not alone look is happening in Australia. Zoom out and see what is happening.

colnames(shark_3) <- c("latitude", "longitude")
center_lat <- -25.2744
center_lon <- 133.7751
zoom_level <- 5  

map <- leaflet() %>%
  addTiles() %>%  
  setView(center_lon, center_lat, zoom = zoom_level)

for (i in 1:nrow(shark_3)) {
  map <- map %>% addMarkers(lng = shark_3$longitude[i], lat = shark_3$latitude[i])
}

map
knitr::include_graphics("media/Australia.png")

This is what the map looks like when zoomed out. Crazy, right?

More Attacks

shark_1$type[is.na(shark_1$type) | shark_1$type == ""] <- "Unknown"
shark_1$type[is.na(shark_1$type) | shark_1$type == "Invalid"] <- "Unknown"
shark_1_subset <- shark_1[1:6302, ]

sharks <-shark_1 %>% 
  group_by(country) %>% 
  ggplot(aes(x = type)) +
   geom_bar(aes(y = ..count..)) + 
  geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

plot(sharks)

Does anyone have an idea what boatomg is? I think they meant boating, but messed up on their English. It is understandable to a degree, English is hard.

More Shark Attacks

shark_2$type[is.na(shark_2$type) | shark_2$type == "Invalid"] <- "Unknown"

shark_2 %>% 
  group_by(area) %>% 
  ggplot(aes(x = type)) +
   geom_bar(aes(y = ..count..)) + 
  geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Wolves

g_wolves$type_of_attack[is.na(g_wolves$type_of_attack) | g_wolves$type_of_attack == ""] <- "Unknown"

wolves <- g_wolves %>% 
  group_by(type_of_attack) %>% 
  ggplot(aes(x = type_of_attack))  +
  geom_bar(aes(y = ..count..)) + 
  geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(x = "Types of Attacks", y = "Victim Count")

wolves

More Wolves

When I was looking and trying to clean the data, there were many factors that was affecting it. The data was not pretty even after trying to clean it. They are even higher than data above, there was some data that represented 15 people that were killed by wolves, all 15 people were placed on the same line.

# Read the CSV file (assuming it's saved as 'global_wolves.csv')
data <- read.csv("predators/global_wolves.csv", stringsAsFactors = FALSE)

data <- clean_names(data)

# Use a regular expression to extract the country from the 'Location' column
data$country <- sub(".*,\\s*(.*)$", "\\1", data$location)

# Extract the country from location string
data$country <- str_extract(data$location, "[^,]+$")

# Trim any leading/trailing whitespace
data$country <- trimws(data$country)

# Replace blank box with NA
data <- data %>%
  mutate(type_of_attack = ifelse(type_of_attack == "", NA, type_of_attack))

w_attacks <-data %>% 
  ggplot(aes(x = country, fill = type_of_attack)) +
  geom_bar(position = "dodge") +
  coord_flip() + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +  
  labs(title = "Attacks and Country",
       x = "Country",
       y = "Count of Attacks") +
  theme_minimal()+
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.text.y = element_text(size = 8))  
knitr::include_graphics("media/wolves_attacks.png")

King

The King of attacks is the shark. The data shows that sharks have attacked, look at the map of Australia again, every marker is where a shark attack has occurred. Also another reason why the shark data is king is due to a lack and missing data from both the wolves and gators. If there was data for Nile Crocs, there might be some competition.

knitr::include_graphics("media/shark.png")

LS0tCnRpdGxlOiAiRmluYWxfUHJvamVjdDogV2hvIGlzIEtpbmcgb2YgQXR0YWNrcz8iCmF1dGhvcjogIk1lYWdoYW4gQmFycmV0dCIKZGF0ZTogIjIwMjUtMDQtMDgiCm91dHB1dDogCiAgICBodG1sX2RvY3VtZW50OgogICAgICAgIHRoZW1lOiBwYXBlcgogICAgICAgIGhpZ2hsaWdodDogdGFuZ28KICAgICAgICB0b2M6IHRydWUKICAgICAgICB0b2NfZmxvYXQ6CiAgICAgICAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICAgICAgZGZfcHJpbnQ6IGthYmxlCiAgICAgICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICAgICAgbW9kZTogc2VsZmNvbnRhaW5lZAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgY2FjaGUgPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKYGBgCgpbUmV0dXJuIHRvIEhvbWVwYWdlXSguLi9pbmRleC5odG1sKQoKIyAqKkludHJvZHVjdGlvbioqCkluIHRoZSBmb2xsb3dpbmcgcmVwb3J0LCBJIHdpbGwgaW52ZXN0aWdhdGUgYW5kIGV4YW1pbmUgd2hpY2ggYW5pbWFsIGlzIHRoZSBraW5nIG9mIGF0dGFja3Mgd2hldGhlciBvbiBsYW5kIG9yIGluIHRoZSB3YXRlciwgYnkgY29tcGFyaW5nIHRoZSBhdHRhY2tzIGZyb20gc2hhcmtzLCB3b2x2ZXMsIGFuZCBhbGxpZ2F0b3JzLiBXaGlsZSB0aGlzIGRhdGEgaGFzIGFscmVhZHkgYmVlbiBzb21ld2hhdCBjbGVhbmVkIGFuZCBjb250YWlucyBmYWlybHkgc2ltcGxlIGluZm9ybWF0aW9uLCB0aGlzIGZpbmFsIHByb2plY3QgYWltcyB0byBpbnZlc3RpZ2F0ZSB0aGUgZGlzcGFyaXRpZXMgYmV0d2VlbiB0aGVzZSB0aHJlZSBhbmltYWxzLCB0aGUgYXR0YWNrIGxvY2F0aW9ucywgYW5kIHRoZSBlZmZlY3RlZCBwb3B1bGF0aW9uLiBJbiBzaW1wbGVyIHRlcm1zLCB3aG8gaXMgcmVzcG9uc2libGUgZm9yIHRoZSBtb3N0IGF0dGFja3M/IFdoaWNoIHBvcHVsYXRpb25zIGFyZSB0aGUgbW9zdCBlZmZlY3RlZD8gV2hlcmUgdGhlc2UgYXR0YWNrcyBwcm92b2tlZCBvciBub3Q/IFRoZXNlIGFyZSBqdXN0IHNvbWUgb2YgdGhlIHF1ZXN0aW9ucyBJIGhvcGUgdG8gZXhwbG9yZSBpbiB0aGlzIHdyaXRpbmcuIAoKIyAqKkJhY2tncm91bmQqKgpUaGlzIHByb2plY3Qgd2FzIGluc3BpcmVkIGluIHBhcnQgYnkgbXkgZmFtaWx5LCBteSBtb3RoZXIgaXMgZnJvbSBGbG9yaWRhIGFuZCB0aGVyZSBoYXZlIGJlZW4gc29tZSB2ZXJ5IGludGVyZXN0aW5nIGRvY3VtZW50YXJpZXMgZG9uZSBvbiBhbGwgdGhlc2UgYW5pbWFscy4gSXQgd2FzIGFsc28gaW5zcGlyZWQgYnkgZ2VuZXJhbCBoYXBwZW4gc3RhbmNlOiBJIGZvdW5kIGEgdmVyeSBuaWNlIGRhdGEgc2V0IG9uIEthZ2dsZSBhbmQgZmVsdCBpdCBjb3VsZCBiZSBhbiBpbnRlcmVzdGluZyB0YWtlIG9uIGEgc2VlbWluZ2x5IGR1bGwgZGF0YSBzZXQuIEFzIG1lbnRpb25lZCwgdGhpcyBkYXRhIHNldCB3YXMgZm91bmQ6IAoKW0ZhdGFsIEFsbGlnYXRvciBBdHRhY2tzXShodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL2RhbmVsYS9mYXRhbC1hbGxpZ2F0b3ItYXR0YWNrcy11cz9yZXNvdXJjZT1kb3dubG9hZCZzZWxlY3Q9ZmF0YWxfYWxsaWdhdG9yX2F0dGFja3NfVVMuY3N2KQoKW1NoYXJrIEF0dGFja3NdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvZmVsaXBlZXNjL3NoYXJrLWF0dGFjay1kYXRhc2V0P3BoYXNlPUZpbmlzaFNTT1JlZ2lzdHJhdGlvbiZyZXR1cm5Vcmw9JTJGZGF0YXNldHMlMkZmZWxpcGVlc2MlMkZzaGFyay1hdHRhY2stZGF0YXNldCUyRnZlcnNpb25zJTJGMSUzRnJlc291cmNlJTNEZG93bmxvYWQmU1NPUmVnaXN0cmF0aW9uVG9rZW49Q2ZESjhQSFNDTDlrOXMxSHVKMmNSRkJGaHVoZ3B4TjBnX0FURElUel8tY1hWRy1uNS1TOFBjQW5aZGdEWEhibjd1ZDBpYVZZTGVZV2tZbkZUWTZOYzRKRnQxbnlXQVpzVHVoUjh2U1B2M29rNVRQNEF0UlJLOS1JekdEcVN6WktVR3hNYXlLSzVOS2tkV2dld1VWWVBNRjFhSmw0cGhQQjRPYndYbDJBSzc2OThDRTIzMHlzczlrZ2JBVktjWkFDQmcwMEZtU1BQa1RzWUdobFd1NHozVnJlenZaRFhvTG4yZVlheUkwNzg0SkRBbmFhMUw1S1ZzdnB6b2xHVGs5VDhobjd1RHRYMjlyd05SYVFXeTE5QnNWMEtaN1RjZkRmRnBZdlJEOHJTTXJxNHlFdWw3LUNSYTJMMVI1cVd2eEVPWU1sR0ktVkZOODdzZ2FiT1ByZ19DSjZqY0phVm8wQ2NzUSZEaXNwbGF5TmFtZT1NZWFnaGFuK0JhcnJldHQpCgpbU2hhcmsgQXR0YWNrcyBCeSBIZW1pc3BoZXJlc10oaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9jb2RlL2ljZWNyZWFtNC9zaGFyay1hdHRhY2tzLWJ5LWhlbWlzcGhlcmVzL25vdGVib29rKSAKCltHbG9iYWwgV29sZiBBdHRhY2tzXShodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL2RhbmVsYS9nbG9iYWwtd29sZi1hdHRhY2tzP3NlbGVjdD1nbG9iYWxfd29sdmVzLmNzdikgCgpUaGUgZGF0YSBzZXQgY29uc2lzdHMgb2YgdmFyaW91cyByZXBvcnRlZCBzdGF0aXN0aWNzIHJlZ2FyZGluZyB0aGVzZSBkaWZmZXJlbnQgYXR0YWNrcy4gTW9zdCBpbmRpdmlkdWFscyB3ZXJlIGF0dGFja2VkIHdlcmUgcHJlZGF0b3J5LiBIb3dldmVyLCBzb21lIGluZGl2aWR1YWxzIHdlcmUgcmVwb3J0ZWQgdG8gcHJvdm9rZSB0aGUgYW5pbWFsLiBEaWZmZXJlbnQgYWdlIGdyb3VwcyB3ZXJlIGF0dGFja2VkIGVhY2ggdGltZS4gCgpQcmV2ZW50aW9uIHdvdWxkIGJlIGdyZWF0LCBidXQgdGhlcmUgaXMgbm90IHNpZ25zIGZvciB0aG9zZSB0aGF0IHdpbGwgYW5kIGNvdWxkIGJlIGF0dGFja2VkLiBBbGxpZ2F0b3JzLCBzaGFya3MsIGFuZCB3b2x2ZXMgaGF2ZSBkaWZmZXJlbnQgcmVhc29ucyB0byBhdHRhY2suICAKCiMgKipEYXRhKioKYGBge3IsIGVjaG8gPSBUUlVFfQojIGxvYWQgYWxsIG5lY2Vzc2FyeSBsaWJyYXJpZXMgCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShzdHJpbmdyKQoKIyByZWFkaW5nIGluIGthZ2dsZSBkYXRhIHNldHMgCmdhdG9yIDwtIHJlYWQuY3N2KCJwcmVkYXRvcnMvZmF0YWxfYWxsaWdhdG9yX2F0dGFja3NfVVMuY3N2IikKCmdfd29sdmVzIDwtIHJlYWQuY3N2KCJwcmVkYXRvcnMvZ2xvYmFsX3dvbHZlcy5jc3YiKQoKc2hhcmtfMSA8LSByZWFkLmNzdigicHJlZGF0b3JzL1NoYXJrX2F0dGFja3MvYXR0YWNrcy5jc3YiKQoKc2hhcmtfMiA8LSByZWFkLmNzdigicHJlZGF0b3JzL3NoYXJrX2F0dGFja3MuY3N2IikKCnNoYXJrXzMgPC0gcmVhZC5jc3YoInByZWRhdG9ycy9TaGFya19hdHRhY2tzL2xpc3RfY29vcl9hdXN0cmFsaWEuY3N2IikKCmBgYApUaGlzIGRhdGEgc2V0IHdhcyByZXRyaWV2ZWQgZnJvbSBLYWdnbGUgYW5kIGhhcyBhbHJlYWR5IGJlZW4gKipzb21ld2hhdCoqIGNsZWFuZWQgZm9yIGFuYWx5c2lzLiBIb3dldmVyLCB0aGVyZSBhcmUgc29tZSBjaGFuZ2VzIEkgd2FudGVkIHRvIG1ha2UgdG8gdGhlIGRhdGEgc3RydWN0dXJlLCBjaGFuZ2luZyBtaXNzaW5nIHZhbHVlcy9lbXB0eSBzcGFjZXMsIGNsZWFuaW5nIHRoZSBuYW1lcywgYW5kIGltcHJvdmluZyBjaGFyYWN0ZXJzIGZvdW5kIHRocm91Z2hvdXQgdGhlIGRhdGEgc2V0LiBUaGUgZm9sbG93aW5nIGNvZGUgYW5kIG91dHB1dHMgZGVtb25zdHJhdGUgdGhlIGNoYW5nZXMgSSd2ZSBtYWRlIHRvIGFsbG93IGZvciBzbW9vdGhlciBkYXRhIGFuYWx5c2lzOiAKCmBgYHtyLCBlY2hvPVRSVUV9CgojIGNvbnZlcnQgY29sdW1uIHRpdGxlcyB0byBzbmFrZV9jYXNlIAoKZ2F0b3IgPC1jbGVhbl9uYW1lcyhnYXRvcikKCmdfd29sdmVzIDwtY2xlYW5fbmFtZXMoZ193b2x2ZXMpCgpzaGFya18xIDwtIGNsZWFuX25hbWVzKHNoYXJrXzEpCgpzaGFya18yIDwtY2xlYW5fbmFtZXMoc2hhcmtfMikKYGBgCgpgYGB7ciBldmFsID0gVFJVRX0KIyBjb252ZXJ0cyBhbGwgTi9BIGNociB2YWx1ZXMgdG8gYWN0dWFsIG1pc3NpbmcgdmFsdWVzIGFuZCBmaWxscyBpbiBlbXB0eSBzcGFjZXMgd2l0aCBtaXNzaW5nIHZhbHVlcyAKCmdfd29sdmVzJHR5cGVfb2ZfYXR0YWNrW2lzLm5hKGdfd29sdmVzJHR5cGVfb2ZfYXR0YWNrKSB8IGdfd29sdmVzJHR5cGVfb2ZfYXR0YWNrID09ICIiXSA8LSAiVW5rbm93biIKCnNoYXJrXzIkdHlwZVtpcy5uYShzaGFya18yJHR5cGUpIHwgc2hhcmtfMiR0eXBlID09ICJJbnZhbGlkIl0gPC0gIlVua25vd24iCgpzaGFya18xIDwtIHNoYXJrXzFbIWlzLm5hKHNoYXJrXzEkdHlwZSksIF0gCnNoYXJrXzFfc3Vic2V0IDwtIHNoYXJrXzFbMTo2MzAyLCBdCm5yb3coc2hhcmtfMSkKbGVuZ3RoKHNoYXJrXzEkdHlwZSkKCiMgQ2hlY2sgd2hpY2ggcm93cyBoYXZlIE5BIG9yIGludmFsaWQgdmFsdWVzCnRhYmxlKGlzLm5hKHNoYXJrXzEkdHlwZSkpICAKdGFibGUoc2hhcmtfMSR0eXBlID09ICJJbnZhbGlkIikgIAoKIyBSZXBsYWNlIG9ubHkgTkFzIGZpcnN0LCB0aGVuIEludmFsaWRzCnNoYXJrXzEkdHlwZVtpcy5uYShzaGFya18xJHR5cGUpXSA8LSAiVW5rbm93biIKc2hhcmtfMSR0eXBlW3NoYXJrXzEkdHlwZSA9PSAiSW52YWxpZCJdIDwtICJVbmtub3duIgoKCiMgY29udmVydHMgZGF0YSBzdHJ1Y3R1cmUgdG8gbW9yZSBhcHByb3ByaWF0ZSBkYXRhIHR5cGVzCmdhdG9yIDwtZ2F0b3IgJT4lIAogIG11dGF0ZShsb2NhdGlvbiA9IHN0cl9leHRyYWN0KGRldGFpbHMsICIoTWlhbWl8RmxvcmlkYXxHZW9yZ2lhfFRleGFzfExvdWlzaWFuYXxTb3V0aCBDYXJvbGluYSkiKSwKICAgICAgICAgbG9jYXRpb24gPSBpZmVsc2UobG9jYXRpb24gPT0gIk1pYW1pIiwgIkZsb3JpZGEiLCBsb2NhdGlvbikpCgpgYGAKCiMgKipBbGxpZ2F0b3IqKgoKQWxsaWdhdG9ycyBhcmUgYmVhdXRpZnVsIGFuZCBkYW5nZXJvdXMgYW5pbWFscy4gVGhpcyBkYXRhIG9ubHkgc2hvd3MgYSBzbWFsbCBhbW91bnQgb2YgZGVhdGhzIHRoYXQgaGF2ZSBiZWVuIGNhdXNlZCBieSBhbGxpZ2F0b3JzLiBUaGVyZSB3YXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgY3JvYywgZXZlbiB0aG91Z2ggdGhleSBkbyBoYXZlIGEgaGFuZCBpbiBtYW55IGRlYXRocyBvdmVyIHRoZSB5ZWFycywgc2luY2UgdGhleSBpbnZhZGVkIHRoZSBTb3V0aC4gVGhpcyBkYXRhIHNob3dzIHRoYXQgRmxvcmlkYSBoYXMgaGFkIHRoZSBtb3N0IG51bWJlciBvZiBhdHRhY2tzLiBJIGhhdmUgbGVhcm5lZCBvdmVyIHRoZSB5ZWFycyBpcyBrZWVwIGFuIGV5ZSBvdXQgd2hlbmV2ZXIgYnkgd2F0ZXIgb24gdGhlIFNvdXRoZXJuIGNvYXN0LCB5b3UgbmV2ZXIga25vdyB3aGF0IG1pZ2h0IHNuYXAgeW91IHVwLiAKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmdhdG9yICU+JQogIG11dGF0ZShkYXRlID0gYXMuRGF0ZShkYXRlLCBmb3JtYXQgPSAiJUIgJWQsICVZIikpICU+JSAgCiAgZmlsdGVyKGFnZSAhPSAiPyIpICU+JQogIG11dGF0ZShhZ2UgPSBhcy5udW1lcmljKGFnZSkpICU+JQogIGZpbHRlcihhZ2UgPj0gMiAmIGFnZSA8PSA4MSkgJT4lCiAgbXV0YXRlKHllYXIgPSBhcy5pbnRlZ2VyKGZvcm1hdChkYXRlLCAiJVkiKSkpICU+JSAgCiAgYXJyYW5nZShhZ2UpICU+JQogIGdyb3VwX2J5KGxvY2F0aW9uKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoeWVhciksIHkgPSBhZ2UsIGNvbG9yID0gbG9jYXRpb24pKSArIAogIGdlb21fcG9pbnQoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJBZ2UiKQpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRX0KZGVhdGhzIDwtZ2F0b3IgJT4lCiAgZmlsdGVyKGxvY2F0aW9uICE9ICI/IikgJT4lICAKICBmaWx0ZXIoc2V4ICE9ICI/IikgJT4lICAgICAgIAogIGdyb3VwX2J5KGxvY2F0aW9uLCBzZXgpICU+JQogIHRhbGx5KCkKCnByaW50KGRlYXRocykKCnZpY3RpbXNfYnlfc3RhdGUgPC1kZWF0aHMgJT4lIAogIGdncGxvdChhZXMoeCA9IGxvY2F0aW9uLCB5ID0gbiwgZmlsbCA9IHNleCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArICAKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCB2anVzdCA9IC0wLjUpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArIAogIGxhYnModGl0bGUgPSAiQWxsaWdhdG9yIEF0dGFja3MgYnkgU3RhdGUiLAogICAgICAgeCA9ICJTdGF0ZSIsIHkgPSAiTnVtYmVyIG9mIFZpY3RpbXMiLCBmaWxsID0gIlNleCIpCgp2aWN0aW1zX2J5X3N0YXRlCmBgYAoKIyAqKlVuZXhwZWN0ZWQgU2hhcmsgQXR0YWNrcyoqCldoZW4gSSBmaXJzdCBzdGFydGVkIHRyeWluZyB0byBjcmVhdGUgdGhpcyBwbG90LCB0aGlzIHdhcyB0aGUgcmVzdWx0LiBBdHRhY2tzIGhhcHBlbmluZyBhYm92ZSBHcmVlbmxhbmQuIEkgbGVhcm5lZCBob3cgd3JvbmcgSSB3YXMuIApgYGB7ciwgb3V0LndpZHRoPSI3MCUiLCBvdXQuaGVpZ2h0PSI3MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibWVkaWEvVW5leHBlY3RlZF9BdHRhY2tzLnBuZyIpCmBgYAoKIyAqKlNoYXJrcyoqCklmIGFueSBvZiB5b3UgaGF2ZSBhIHVucmVhbGlzdGljIGZlYXIgdGhhdCB0aGVyZSBpcyBzb21ldGhpbmcgaW4gdGhlIHdhdGVyIGFuZCB5b3Ugd2lsbCBnZXQgYXR0YWNrZWQuIFlvdSdyZSBub3QgYWxvbmUgbG9vayBpcyBoYXBwZW5pbmcgaW4gQXVzdHJhbGlhLiBab29tIG91dCBhbmQgc2VlIHdoYXQgaXMgaGFwcGVuaW5nLgoKYGBge3IsIGVjaG8gPSBUUlVFfQoKY29sbmFtZXMoc2hhcmtfMykgPC0gYygibGF0aXR1ZGUiLCAibG9uZ2l0dWRlIikKY2VudGVyX2xhdCA8LSAtMjUuMjc0NApjZW50ZXJfbG9uIDwtIDEzMy43NzUxCnpvb21fbGV2ZWwgPC0gNSAgCgptYXAgPC0gbGVhZmxldCgpICU+JQogIGFkZFRpbGVzKCkgJT4lICAKICBzZXRWaWV3KGNlbnRlcl9sb24sIGNlbnRlcl9sYXQsIHpvb20gPSB6b29tX2xldmVsKQoKZm9yIChpIGluIDE6bnJvdyhzaGFya18zKSkgewogIG1hcCA8LSBtYXAgJT4lIGFkZE1hcmtlcnMobG5nID0gc2hhcmtfMyRsb25naXR1ZGVbaV0sIGxhdCA9IHNoYXJrXzMkbGF0aXR1ZGVbaV0pCn0KCm1hcAoKYGBgCgoKYGBge3IsIG91dC53aWR0aD0iNzAlIiwgb3V0LmhlaWdodD0iNzAlIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIm1lZGlhL0F1c3RyYWxpYS5wbmciKQpgYGAKCgpUaGlzIGlzIHdoYXQgdGhlIG1hcCBsb29rcyBsaWtlIHdoZW4gem9vbWVkIG91dC4gQ3JhenksIHJpZ2h0PwoKCiMgICoqTW9yZSBBdHRhY2tzKioKYGBge3IsIGVjaG89VFJVRX0KCnNoYXJrXzEkdHlwZVtpcy5uYShzaGFya18xJHR5cGUpIHwgc2hhcmtfMSR0eXBlID09ICIiXSA8LSAiVW5rbm93biIKc2hhcmtfMSR0eXBlW2lzLm5hKHNoYXJrXzEkdHlwZSkgfCBzaGFya18xJHR5cGUgPT0gIkludmFsaWQiXSA8LSAiVW5rbm93biIKc2hhcmtfMV9zdWJzZXQgPC0gc2hhcmtfMVsxOjYzMDIsIF0KCnNoYXJrcyA8LXNoYXJrXzEgJT4lIAogIGdyb3VwX2J5KGNvdW50cnkpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB0eXBlKSkgKwogICBnZW9tX2JhcihhZXMoeSA9IC4uY291bnQuLikpICsgCiAgZ2VvbV90ZXh0KHN0YXQgPSAnY291bnQnLCBhZXMobGFiZWwgPSAuLmNvdW50Li4pLCB2anVzdCA9IC0wLjUpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQoKcGxvdChzaGFya3MpCmBgYAoKCkRvZXMgYW55b25lIGhhdmUgYW4gaWRlYSB3aGF0IGJvYXRvbWcgaXM/IEkgdGhpbmsgdGhleSBtZWFudCBib2F0aW5nLCBidXQgbWVzc2VkIHVwIG9uIHRoZWlyIEVuZ2xpc2guIEl0IGlzIHVuZGVyc3RhbmRhYmxlIHRvIGEgZGVncmVlLCBFbmdsaXNoIGlzIGhhcmQuIAoKCiMgKipNb3JlIFNoYXJrIEF0dGFja3MqKgpgYGB7ciwgZWNobyA9IFRSVUV9CgpzaGFya18yJHR5cGVbaXMubmEoc2hhcmtfMiR0eXBlKSB8IHNoYXJrXzIkdHlwZSA9PSAiSW52YWxpZCJdIDwtICJVbmtub3duIgoKc2hhcmtfMiAlPiUgCiAgZ3JvdXBfYnkoYXJlYSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHR5cGUpKSArCiAgIGdlb21fYmFyKGFlcyh5ID0gLi5jb3VudC4uKSkgKyAKICBnZW9tX3RleHQoc3RhdCA9ICdjb3VudCcsIGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHZqdXN0ID0gLTAuNSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgpgYGAKCgojICAqKldvbHZlcyoqCgpgYGB7ciwgZWNobz1UUlVFfQpnX3dvbHZlcyR0eXBlX29mX2F0dGFja1tpcy5uYShnX3dvbHZlcyR0eXBlX29mX2F0dGFjaykgfCBnX3dvbHZlcyR0eXBlX29mX2F0dGFjayA9PSAiIl0gPC0gIlVua25vd24iCgp3b2x2ZXMgPC0gZ193b2x2ZXMgJT4lIAogIGdyb3VwX2J5KHR5cGVfb2ZfYXR0YWNrKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gdHlwZV9vZl9hdHRhY2spKSAgKwogIGdlb21fYmFyKGFlcyh5ID0gLi5jb3VudC4uKSkgKyAKICBnZW9tX3RleHQoc3RhdCA9ICdjb3VudCcsIGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHZqdXN0ID0gLTAuNSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsKICBsYWJzKHggPSAiVHlwZXMgb2YgQXR0YWNrcyIsIHkgPSAiVmljdGltIENvdW50IikKCndvbHZlcwpgYGAKCiMgKipNb3JlIFdvbHZlcyoqIApXaGVuIEkgd2FzIGxvb2tpbmcgYW5kIHRyeWluZyB0byBjbGVhbiB0aGUgZGF0YSwgdGhlcmUgd2VyZSBtYW55IGZhY3RvcnMgdGhhdCB3YXMgYWZmZWN0aW5nIGl0LiBUaGUgZGF0YSB3YXMgbm90IHByZXR0eSBldmVuIGFmdGVyIHRyeWluZyB0byBjbGVhbiBpdC4gVGhleSBhcmUgZXZlbiBoaWdoZXIgdGhhbiBkYXRhIGFib3ZlLCB0aGVyZSB3YXMgc29tZSBkYXRhIHRoYXQgcmVwcmVzZW50ZWQgMTUgcGVvcGxlIHRoYXQgd2VyZSBraWxsZWQgYnkgd29sdmVzLCBhbGwgMTUgcGVvcGxlIHdlcmUgcGxhY2VkIG9uIHRoZSBzYW1lIGxpbmUuIAoKYGBge3IsIGVjaG89VFJVRX0KIyBSZWFkIHRoZSBDU1YgZmlsZSAoYXNzdW1pbmcgaXQncyBzYXZlZCBhcyAnZ2xvYmFsX3dvbHZlcy5jc3YnKQpkYXRhIDwtIHJlYWQuY3N2KCJwcmVkYXRvcnMvZ2xvYmFsX3dvbHZlcy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgpkYXRhIDwtIGNsZWFuX25hbWVzKGRhdGEpCgojIFVzZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBleHRyYWN0IHRoZSBjb3VudHJ5IGZyb20gdGhlICdMb2NhdGlvbicgY29sdW1uCmRhdGEkY291bnRyeSA8LSBzdWIoIi4qLFxccyooLiopJCIsICJcXDEiLCBkYXRhJGxvY2F0aW9uKQoKIyBFeHRyYWN0IHRoZSBjb3VudHJ5IGZyb20gbG9jYXRpb24gc3RyaW5nCmRhdGEkY291bnRyeSA8LSBzdHJfZXh0cmFjdChkYXRhJGxvY2F0aW9uLCAiW14sXSskIikKCiMgVHJpbSBhbnkgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlCmRhdGEkY291bnRyeSA8LSB0cmltd3MoZGF0YSRjb3VudHJ5KQoKIyBSZXBsYWNlIGJsYW5rIGJveCB3aXRoIE5BCmRhdGEgPC0gZGF0YSAlPiUKICBtdXRhdGUodHlwZV9vZl9hdHRhY2sgPSBpZmVsc2UodHlwZV9vZl9hdHRhY2sgPT0gIiIsIE5BLCB0eXBlX29mX2F0dGFjaykpCgp3X2F0dGFja3MgPC1kYXRhICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjb3VudHJ5LCBmaWxsID0gdHlwZV9vZl9hdHRhY2spKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgY29vcmRfZmxpcCgpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyAgCiAgbGFicyh0aXRsZSA9ICJBdHRhY2tzIGFuZCBDb3VudHJ5IiwKICAgICAgIHggPSAiQ291bnRyeSIsCiAgICAgICB5ID0gIkNvdW50IG9mIEF0dGFja3MiKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpICAKYGBgCgpgYGB7ciwgb3V0LndpZHRoPSI3MCUiLCBvdXQuaGVpZ2h0PSI3MCUifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibWVkaWEvd29sdmVzX2F0dGFja3MucG5nIikKYGBgCgojICoqS2luZyoqCgpUaGUgS2luZyBvZiBhdHRhY2tzIGlzIHRoZSBzaGFyay4gVGhlIGRhdGEgc2hvd3MgdGhhdCBzaGFya3MgaGF2ZSBhdHRhY2tlZCwgbG9vayBhdCB0aGUgbWFwIG9mIEF1c3RyYWxpYSBhZ2FpbiwgZXZlcnkgbWFya2VyIGlzIHdoZXJlIGEgc2hhcmsgYXR0YWNrIGhhcyBvY2N1cnJlZC4gQWxzbyBhbm90aGVyIHJlYXNvbiB3aHkgdGhlIHNoYXJrIGRhdGEgaXMga2luZyBpcyBkdWUgdG8gYSBsYWNrIGFuZCBtaXNzaW5nIGRhdGEgZnJvbSBib3RoIHRoZSB3b2x2ZXMgYW5kIGdhdG9ycy4gSWYgdGhlcmUgd2FzIGRhdGEgZm9yIE5pbGUgQ3JvY3MsIHRoZXJlIG1pZ2h0IGJlIHNvbWUgY29tcGV0aXRpb24uIAoKCmBgYHtyLCBvdXQud2lkdGg9IjcwJSIsIG91dC5oZWlnaHQ9IjcwJSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJtZWRpYS9zaGFyay5wbmciKQpgYGAKCgo=